#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef  int DataType;

typedef  struct Node {
    DataType data;
    struct Node *next;
} LNode;

int ListInitiate(LNode **head);//单链表初始化，成功函数返回0，否则返回1.

int ListLength(LNode *head);//函数返回由head所表示的单链表的长度

int ListInsert(LNode *head, int i, DataType x);//在由head所表示的单链表里插入一个元素x到位置i，插入成功返回0，否则返回1

int ListDelete(LNode *head, int i, DataType *x);//释放所有的由head所表示的单链表的元素借点，完全成功返回0，否则返回1

int ListGet(LNode *head, int i, DataType *x);

int Destroy(LNode **head);

//初始化链表
int ListInitiate(LNode **head) {
    *head = (LNode *)malloc(sizeof(LNode));
    if (*head == NULL) {
        return 1;
    }
    (*head)->next = NULL;
    return 0;
}

//计算链表长度
int ListLength(LNode *head) {
    int length = 0;
    LNode *p = head->next;
    while (p != NULL) {
        length++;
        p = p->next;
    }
    return length;
}

//在位置i插入元素x
int ListInsert(LNode *head, int i, DataType x) {
    LNode *p = head, *s;
    int j = 0;

    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }
    if (p == NULL || j < i) {
        return 1;
    }

    s = (LNode *)malloc(sizeof(LNode));
    if (s == NULL) {
        return 1;
    }

    s->data = x;
    s->next = p->next;
    p->next = s;
    return 0;
}

//删除位置i的元素，并返回其值到x
int ListDelete(LNode *head, int i, DataType *x) {
    LNode *p = head, *q;
    int j = 0;

    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }

    if (p->next == NULL || j > i) {
        return 1;
    }

    q = p->next;
    *x = q->data;
    p->next = q->next;
    free(q);
    return 0;
}

//获取位置i的元素，并返回其值到x
int ListGet(LNode *head, int i, DataType *x) {
    LNode *p = head->next;
    int j = 0;

    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }

    if (p == NULL || j < i) {
        return 1;
    }

    *x = p->data;
    return 0;
}

int Destroy(LNode **head) {
    LNode *p = *head, *q;
    while (p != NULL) {
        q = p;
        p = p->next;
        free(q);
    }
    *head = NULL;
    return 0;
}

int main(void) {
    LNode *head;
    int i, x;
    ListInitiate(&head);//初始化

    for (i = 0; i < 10; i++) {
        if (ListInsert(head, i, i+1) != 0) {
            printf("Insert Error \n");
            return 1;
        }
    }

    if (ListDelete(head, 4, &x) != 0) {
        printf("Delete Error \n");
        return 1;
    }

    for (i = 0;i < ListLength(head);i++) {
        if (ListGet(head, i, &x) != 0) {
            printf("Get Error \n");
            return 1;
        } else {
        printf("%d", x);
    }
    }
    printf("\n");

    Destroy(&head);
    return 0;
}